// 得到一个合法字符的数组(数字 大小写字母 下划线)
var numList = [];
for (var i = 48; i <= 57; i++) {
    var char = String.fromCharCode(i); //根据编码返回对应的字符
    numList.push(char);
}
console.log(numList);

var smallList = [];
for (var i = 97; i <= 122; i++) {
    var char = String.fromCharCode(i); //根据编码返回对应的字符
    smallList.push(char);
}
console.log(smallList);

var bigList = [];
for (var i = 65; i <= 90; i++) {
    var char = String.fromCharCode(i); //根据编码返回对应的字符
    bigList.push(char);
}
console.log(bigList);

var speList = ["_"];// 允许使用的特殊字符的集合

var normalList = numList.concat(smallList, bigList, speList);
console.log(normalList);


function randCode(len) {
    len = len == undefined ? 4 : len;  //默认值(4)

    var list = numList.concat(smallList, bigList);
    var arr = [];
    for (var i = 0; i < len; i++) {  // 假如 i=2时 随机元素重复
        var index = Math.round(Math.random() * (list.length - 1));
        var item = list[index];
        if (arr.indexOf(item) == -1) {  // 不存在  => 放
            arr.push(item);   //把随机的元素放到数组中
        } else { // 存在   => 如果不做任何操作 会少放一次
            //  => 假如 i=2时 随机元素重复 i-- => i=1  本次循环结束  i++ => i=2 (忽略本次,再来一次)
            i--;  // i--   
        }
    }
    console.log(arr);

    return arr.join("");

}